package com.polaris.live.common.network

import com.polaris.live.common.cacha.CacheUtil

/**
 * 描述　:服务器返回数据的基类
 * 如果你的项目中有基类，那美滋滋，可以继承BaseResponse，请求时框架可以帮你自动脱壳，自动判断是否请求成功，怎么做：
 * 1.继承 BaseResponse
 * 2.重写isSucces 方法，编写你的业务需求，根据自己的条件判断数据是否请求成功
 * 3.重写 getResponseCode、getResponseData、getResponseMsg方法，传入你的 code data msg
 *
 * @author Created by 半仙 on 2023/7/31/031 16:41
 */
data class ApiResponse<T>(
    val code: Int,
    val timestamp: Long,
    val errorMessage: String? = null,
    val ext: Map<String, Any>? = null,
    val result: T?
) : BaseResponse<T>() {

    // 这里是示例， 200 就代表请求成功，请你根据自己的业务需求来改变
    override fun isSuccess() = code == HTTP_SUCCESS_CODE

    override fun getResponseCode() = code

    override fun getResponseData() = result

    override fun getResponseMsg() = errorMessage ?: "unknown"

    override fun getErrorExt() = ext

    companion object {

        fun <T> error(code: Int, errorMessage: String, ext: Map<String, Any>? = null): ApiResponse<T> =
            ApiResponse(code, CacheUtil.getServerTime(), errorMessage, ext, null)
    }
}

/**
 * 创建一个新的对象
 */
fun <T, R> ApiResponse<T>.new(newResult: R): ApiResponse<R> {
    return ApiResponse(code, timestamp, getResponseMsg(), ext, newResult)
}

/**
 * 成功并且有数据
 */
fun <T> BaseResponse<T>.isSuccessAndValuable(): Boolean {
    return isSuccess() && getResponseData() != null
}

/**
 * 获取成功的数据，如果失败将返回空
 *
 * 主要用于只关注成功数据的情况
 */
fun <T> BaseResponse<T>.getSuccessResult(): T? {
    return if (isSuccess()) {
        getResponseData()
    } else {
        null
    }
}

const val HTTP_SUCCESS_CODE = 200
const val HTTP_ERROR_CODE = 500